package com.zhkc.iess.auth;

import com.zhkc.wisdom.common.feign.annotation.ZhkcCloudApplication;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;

@ZhkcCloudApplication
@MapperScan("com.zhkc.iess.auth.mapper")
public class AuthApplication {

    /**
     * SA-TOKEN-OAuth2逻辑：（需要提前注册两个参数：client_id 和 client_secret，grant_type固定为client_credentials）
     * 1、后端获取token，（模式四：凭证式（Client Credentials）），在OAuth2.0中还有一种针对 Client级别的授权， 即：Client-Token，代表应用自身的资源授权
     * Client-Token具有延迟作废特性，即：在每次获取最新Client-Token的时候，旧Client-Token不会立即过期，而是作为Lower-Client-Token再次 储存起来，
     * 资源请求方只要携带其中之一便可通过Token校验，这种特性保证了在大量并发请求时不会出现“新旧Token交替造成的授权失效”， 保证了服务的高可用。
     * 获取的token为Client-Token，服务端需要验证解析 Client-Token，获取当前的客户端信息，
     *
     *
     *2、获取的都是用户的 Access-Token，例如使用 模式一授权码：OAuth2.0标准授权流程，先 (重定向) 获取Code授权码，再 (Rest API) 获取 Access-Token 和 Openid
     * 大致流程为：A 网站提供一个链接，用户点击后就会跳转到 B 网站，授权用户数据给 A 网站使用。在用户点击跳转之后，B网站会要求用户进行登录，然后询问是否统一给A网站授权，如果同意授权，B网站就会跳回
     * redirect_uri参数指定的地址，跳转的时候会回传一个授权码（例如：https://a.com/callback?code=AUTHORIZATION_CODE），这里就是服务端下发授权码。A网站拿到授权码之后，就可以在后端（A网站后端）
     * 向B网站请求令牌，B网站收到请求以后，就会颁发令牌（具体做法是向redirect_uri指定的网址，发送一段 JSON 数据），这样A网站后端就拿到了令牌。
     *
     * 为什么需要两次重定向（为什么不能直接把令牌返回给A网站后端，不要获取code这一步），参考：https://blog.csdn.net/CSDNedu/article/details/143511055
     *   1、如果第一次用户在授权之后，直接重定向令牌信息到浏览器，相当于把令牌暴露在了浏览器，非常不安全
     *   2、如果没要授权码，直接返回令牌给A网站后端，这个时候 用户在授权之后，就一直停留在授权页面，用户和A 网站之间的连接断了。所以需要2次重定向，在用户授权之后，B网站重新重定向到 A网站上，这样用户和
     *   A网站就有了连接。为了重新建立起这样的一次连接，我们又不能让访问令牌暴露出去，就有了这样一个临时的、间接的凭证：授权码
     *
     *
     *
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(AuthApplication.class, args);
    }

}
